//package com.example.springbootdemo.generator;
//
//import com.baomidou.mybatisplus.generator.AutoGenerator;
//import com.baomidou.mybatisplus.generator.FastAutoGenerator;
//import com.baomidou.mybatisplus.generator.config.DataSourceConfig;
//import com.baomidou.mybatisplus.generator.config.GlobalConfig;
//import lombok.extern.slf4j.Slf4j;
//
//import java.util.Arrays;
//import java.util.List;
//
///**
// * <p>
// *  MybatisPlus代码生成器
// * </p>
// *
// * @author yurenwei
// * @since 2023/9/19
// */
//@Slf4j
//public class MybatisPlusGenerator {
//
//    /**
//     * 指定具体项目模块
//     */
//    public static String MODULE_NAME = "springboot-demo";
//    /**
//     * 作者
//     */
//    public static String AUTHOR_NAME = "yurenwei";
//    /**
//     * 数据源信息
//     */
//    public static String URL = "jdbc:mysql://81.68.97.33:3306/test?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&useSSL=false&useAffectedRows=true&serverTimezone=Asia/Shanghai";
//    public static String DRIVER_NAME = "com.mysql.cj.jdbc.Driver";
//    public static String USERNAME = "root";
//    public static String PASSWORD = "yrw123456";
//    /**
//     * 包设置
//     */
//    public static String PARENT_PACKAGE = "com.example.springbootdemo";
//    public static String MAPPER_PATH = "/src/main/resources/mybatis-mapper/";
//    /**
//     * DTO/VO 包路径
//     */
//    public static String PARENT_DTO_PATH = "\\src\\main\\java\\com\\example\\springbootdemo\\dto\\";
//    public static String PARENT_VO_PATH = "\\src\\main\\java\\com\\example\\springbootdemo\\vo\\";
//    /**
//     * DTO/VO 包名
//     */
//    public static String PARENT_DTO_PACKAGE = "com.example.springbootdemo.dto";
//    public static String PARENT_VO_PACKAGE = "com.example.springbootdemo.vo";
//    /**
//     * DTO/VO 自定义模板路径
//     */
//    public static String TEMPLATE_CONTROLLER_PATH = "/vm/java/controller.java";
//    public static String TEMPLATE_SERVICE_PATH = "/vm/java/service.java";
//    public static String TEMPLATE_ISERVICE_PATH = "/vm/java/iservice.java";
//    public static String TEMPLATE_ISERVICEIMPL_PATH = "/vm/java/iServiceImpl.java";
//    public static String TEMPLATE_MAPPER_PATH = "/vm/java/mapper.java";
//    public static String TEMPLATE_MAPPER_XML_PATH = "/vm/xml/mapper.xml.vm";
//    /**
//     * DTO/VO 自定义模板路径
//     */
//    public static String TEMPLATE_DTO_PATH = "/vm/java/dto.java.vm";
//    public static String TEMPLATE_VO_PATH = "/vm/java/vo.java.vm";
//
//    /**
//     * controller 层请求路径前缀
//     */
//    public static String REQUEST_PATH_PREFIX = "cloud/sample/api/v1/";
//
//    /**
//     * 表前缀,生成实体类时，会自动去除表前缀，如：table: tb_task, class: Task
//     */
//    public static String TABLE_PREFIX_ENTITY = "t_";
//
//    /**
//     * 需要生成的表名前缀,若为空，则默认是需要生成的表名是 TABLE_SUFFIX
//     */
//    public static String TABLE_PREFIX = "t_";
//    /**
//     * 需要生成的表名后缀，多个用逗号隔开
//     */
//    public static String TABLE_SUFFIX = "user";
//
//    /**
//     * DTO 忽略的字段
//     */
//    public static String DTO_IGNORE_FIELD = "id,createBy,createTime,updateBy,updateTime,isDeleted";
//
//    public static void main(String[] args) {
//        if ("".equals(TABLE_SUFFIX)) {
//            log.info("----->>>需要生成的表名为空");
//            return;
//        }
//        //表拼接
//        String[] tables;
//        if ("".equals(TABLE_PREFIX)) {
//            tables = TABLE_SUFFIX.split(",");
//        } else {
//            List<String> tableList = Arrays.asList(TABLE_SUFFIX.split(","));
//            tables = tableList.stream().map(MybatisPlusGenerator::apply).toArray(String[]::new);
//
//        }
//        log.info("表：");
//        Arrays.stream(tables).forEach(System.out::println);
//
//        // 代码生成器
//        FastAutoGenerator generator = FastAutoGenerator.create(URL,USERNAME,PASSWORD);
//        String projectPath = System.getProperty("user.dir");
//        // 全局配置
//        generator.globalConfig(builder -> {
//            builder.author(AUTHOR_NAME) //作者
//                            .enableSwagger() //启用swagger
//                            .fileOverride() // 覆盖已生成文件
//                            .outputDir(projectPath + "/" + MODULE_NAME + "/src/main/java"); //设置代码生成路径
//        });
//
//        // 包配置
//        generator.packageConfig(builder -> {
//            builder.parent("com.example.springbootdemo") // 父包名
//                    .controller("controller") // controller包名
//                    .service("mybatisplus") // 接口包名
//                    .serviceImpl("mybatisplus.impl") // 接口实现类包名
//                    .mapper("mapper") // mapper包名
//                    .entity("entity"); // 实体类包名
//        });
//
//
//
//        //自定义配置，配置自定义属性注入
//        generator.injectionConfig()
//        InjectionConfig cfg = new InjectionConfig() {
//            //在.ftl(或者是.vm)模板中，通过${cfg.abc}获取属性
//            @Override
//            public void initMap() {
//                //自定义生成模板参数
//                Map<String, Object> map = new HashMap<>();
//                map.put("abc", this.getConfig().getGlobalConfig().getAuthor() + "-mp");
//                //模板中获取值：${cfg.requestPathPrefix}
//                map.put("requestPathPrefix", REQUEST_PATH_PREFIX);
//                map.put("dtoPackage", PARENT_DTO_PACKAGE);
//                map.put("voPackage", PARENT_VO_PACKAGE);
//                map.put("queryDtoPackage", PARENT_Query_DTO_PACKAGE);
//                map.put("dtoIgnoreFields", DTO_IGNORE_FIELD);
//                this.setMap(map);
//            }
//        };
//
//        // 如果模板引擎是 freemarker
//        // String templatePath = "/templates/mapper.xml.vm.ftl";
//        // 如果模板引擎是 velocity：
//        // String templatePath = "/templates/mapper.xml.vm" ;
//        //自定义输出配置
//        List<FileOutConfig> focList = new ArrayList<>();
//        // 自定义配置会被优先输出
//        focList.add(new FileOutConfig(TEMPLATE_MAPPER_XML_PATH) {
//            @Override
//            public String outputFile(TableInfo tableInfo) {
//                // 自定义输出文件名 ， 如果你 Entity 设置了前后缀、此处注意 xml 的名称会跟着发生变化！！
//                return projectPath + "/" + MOUDLE_NAME + MAPPER_PATH + tableInfo.getEntityName() + "Mapper" + StringPool.DOT_XML;
//            }
//        });
//        //自定义生成类DTO/VO/QueryDOT
//        focList.add(new FileOutConfig(TEMPLATE_DTO_PATH) {
//            @Override
//            public String outputFile(TableInfo tableInfo) {
//                // 自定义输出文件名 ， 如果你 Entity 设置了前后缀、此处注意 xml 的名称会跟着发生变化！！
//                return projectPath + "\\" + MOUDLE_NAME + PARENT_DTO_PATH + tableInfo.getEntityName() + "DTO" + StringPool.DOT_JAVA;
//            }
//        });
//        focList.add(new FileOutConfig(TEMPLATE_VO_PATH) {
//            @Override
//            public String outputFile(TableInfo tableInfo) {
//                // 自定义输出文件名 ， 如果你 Entity 设置了前后缀、此处注意 xml 的名称会跟着发生变化！！
//                return projectPath + "\\" + MOUDLE_NAME + PARENT_VO_PATH + tableInfo.getEntityName() + "VO" + StringPool.DOT_JAVA;
//            }
//        });
//        focList.add(new FileOutConfig(TEMPLATE_QUERY_DTO_PATH) {
//            @Override
//            public String outputFile(TableInfo tableInfo) {
//                // 自定义输出文件名 ， 如果你 Entity 设置了前后缀、此处注意 xml 的名称会跟着发生变化！！
//                return projectPath + "\\" + MOUDLE_NAME + PARENT_Query_DTO_PATH + tableInfo.getEntityName() + "QueryDTO" + StringPool.DOT_JAVA;
//            }
//        });
//        cfg.setFileOutConfigList(focList);
//        mpg.setCfg(cfg);
//
//        // 自定义模板
//        TemplateConfig templateConfig = new TemplateConfig();
//        //控制:不生java下成xml
//        templateConfig.setXml(null);
//        templateConfig.setEntity(null);
//
//        // 配置自定义输出模板
//        //指定自定义模板路径，注意不要带上.ftl/.vm, 会根据使用的模板引擎自动识别
//        // templateConfig.setEntity("templates/entity2.java");
//        templateConfig.setController(TEMPLATE_CONTROLLER_PATH);
//        templateConfig.setService(TEMPLATE_SERVICE_PATH);
//        templateConfig.setServiceImpl(TEMPLATE_SERVICEIMPL_PATH);
//        templateConfig.setMapper(TEMPLATE_MAPPER_PATH);
//        mpg.setTemplate(templateConfig);
//
//        // 策略配置
//        StrategyConfig sc = new StrategyConfig();
//        sc.setNaming(NamingStrategy.underline_to_camel);
//        sc.setColumnNaming(NamingStrategy.underline_to_camel);
//        sc.setEntityLombokModel(true);//自动lombok
//        sc.setRestControllerStyle(true);
//        sc.setControllerMappingHyphenStyle(true);
//        sc.setLogicDeleteFieldName("deleted");//设置逻辑删除
//
//        //设置自动填充配置
//        TableFill gmt_create = new TableFill("create_time", FieldFill.INSERT);
//        TableFill gmt_modified = new TableFill("update_time", FieldFill.INSERT_UPDATE);
//        ArrayList<TableFill> tableFills = new ArrayList<>();
//        tableFills.add(gmt_create);
//        tableFills.add(gmt_modified);
//        sc.setTableFillList(tableFills);
//
//        //乐观锁
//        sc.setVersionFieldName("version");
//        sc.setRestControllerStyle(true);//驼峰命名
//
//        sc.setTablePrefix(TABLE_PREFIX_ENTITY); //设置表名前缀
//        sc.setInclude(tables);//表名，多个英文逗号分割
//        mpg.setStrategy(sc);
//
//        // 生成代码
//        mpg.execute();
//    }
//
//    private static String apply(String t) {
//        return TABLE_PREFIX + t;
//    }
//
//}
